Γενικά, το όλο θέμα με έβαλε σε σκέψεις και σε ανησυχίες και είπα να το ψάξω λίγο παραπάνω… Ψάξιμο στο ψάξιμο, βρήκα αυτό το άρθρο στο support του office όπου αναφέρει:
Dragging Outlook Items to an OLE Container Control
You can use an OLE container control on a Visual Basic form to hold objects that you drag to it. When you drag Outlook items to these controls, Outlook exposes only a few fields, and there is no way to change which fields are exposed.
Το οποίο επιβεβαίωσε τους πειραματισμούς μου που ανέφερα σε προηγούμενο post. Το περίεργο συνέβη όταν έβαλα το keyword FileGroupDescriptor στο Google… Πήρα links που αφορούν το drag-n-drop αλλά και το clipboard… Χμμμ… περίεργο… Και τότε είδα το φως! Μα φυσικά! Το OLE DnD (που μας ενδιαφέρει εδώ και εν διαστάσει με το “File Manager DnD”) είναι μια παραλλαγή του Copy/Paste και χρησιμοποιεί και αυτό το clipboard!
Αφού αυτομαστιγώθηκα για τιμωρία που δεν το σκέφτηκα νωρίτερα, συνέχισα το ψάξιμο, προς την κατεύθυνση του clipboard. Αν χρησιμοποιήσετε το clipboard viewer και κάνετε copy/paste ένα mail item του outlook θα δείτε τα ίδια ακριβώς data που αναφέρει το άρθρο από το support. Που βρίσκονται λοιπόν τα υπόλοιπα data;
Κατ’ αρχήν, όταν κάνουμε copy κάτι στο clipboard, μεταφέρουμε data τα οποία ενδέχεται να έχουν πολλαπλές όψεις. Για παράδειγμα, αν κάνουμε copy κείμενο, αυτό μπορεί να μπει και με τη Unicode μορφή του αλλά και με την ANSI.
Για να δούμε λοιπόν αυτά τα data, θα πρέπει να χρησιμοποιήσουμε την κλάση Clipboard που μας παρέχει το Framework για να χειριζόμαστε το clipboard. Αυτή η κλάση έχει δύο methods, την GetData και την SetData που φαντάζεστε τι κάνουν… Αυτά τα δύο methods βγάζουν στο IDataObject interface το οποίο μας παρέχει μερικά πολύ ενδιαφέροντα methods, όπως το GetFormats με το οποίο μπορούμε να κάνουμε ένα iteration στα formats που περιέχει το DataObject.
Έτσι λοιπόν, με αυτόν τον κώδικα
Dim clpbrdDO As IDataObject = Clipboard.GetDataObject
Dim Frmt() As String = clpbrdDO.GetFormats(False)
Dim strRslt As String
Dim i As Integer
For i = 0 To Frmt.Length - 1
strRslt += Frmt(i) + ControlChars.CrLf
Next i
MessageBox.Show(strRslt)
Μπορούμε πολύ εύκολα να δούμε τι στο καλό περιέχει το clipboard!
Αν συγκρίνετε τα Formats από τα αποτελέσματα του παραπάνω κώδικα, σε σχέση με τα members της κλάσης DataFormats, θα δείτε ότι πολλά από αυτά δεν υπάρχουν στην κλάση DataFormats και αυτό γιατί πέρα από τα standard clipboard formats, υπάρχουν και τα private (για την ακρίβεια υπάρχουν πολλά περισσότερα). Έτσι και το Outlook έχει το δικό του private format και επιπρόσθετα κάποιες περιορισμένες text πληροφορίες στις οποίες αναφέρεται το άρθρο στο support του office. Το τελειωτικό χτύπημα ήρθε, όταν ψάχνοντας για το private format του Outlook βγήκα σε αυτό το post από το microsoft.public.dotnet.framework.windowsforms στο οποίο διαβάζουμε από επίσημα …δάχτυλα, ότι τελικά δεν υπάρχει τρόπος να διαβάσουμε το private format του Outlook (τουλάχιστον μέσα από .ΝΕΤ) γιατί ακριβώς είναι private και η Microsoft δεν προτίθεται να το δημοσιεύσει... Ίσως όμως κάποιος καλός άνθρωπος που ξέρει C++ και ATL και MFC μπορεί να φτιάξει ένα τέτοιο component γιατί χωρίς .ΝΕΤ γίνεται η δουλειά...
Vir prudens non contra ventum mingit